package com.algorithm.ch1.cjm.string;

/**
 * 最长公共前缀
 * 编写一个函数来查找字符串数组中的最长公共前缀。
 * <p>
 * 如果不存在公共前缀，返回空字符串 ""。
 * <p>
 * 示例 1:
 * <p>
 * 输入: ["flower","flow","flight"]
 * 输出: "fl"
 * 示例 2:
 * <p>
 * 输入: ["dog","racecar","car"]
 * 输出: ""
 * 解释: 输入不存在公共前缀。
 * 说明:
 * <p>
 * 所有输入只包含小写字母 a-z 。
 */
public class LongestCommonPrefix {

    public static void main(String[] args) {
        System.out.println(new LongestCommonPrefix().longestCommonPrefix(new String[]{"abc", "abdd"}));
    }

    /**
     *
     * 第一版
     * T(n) = n + n * n
     * f(n) = n^2
     * @param strs
     * @return
     */
    public String longestCommonPrefix(String[] strs) {

        if(strs.length == 0){
            return "";
        }

        //求最小长度
        int minLength = strs[0].length();

        for (String str : strs){

            if(minLength > str.length()){
                minLength = str.length();
            }
        }

        int index = 0;
        while (index < minLength && isCommonPrefix(strs, index)){
            index++;
        }

        return strs[0].substring(0, index);
    }

    /**
     * 判断数组的字符串，在当前位置是否相等
     * @param strs
     * @param index
     * @return
     */
    private boolean isEqual(String[] strs, int index){

        int length = strs.length;
        int fromIndex = 0;

        char ch = strs[0].charAt(index);
        while (fromIndex < length && ch == strs[fromIndex].charAt(index)){

            fromIndex ++;
        }
        return fromIndex == length;
    }

    /**
     * 通过字符串
     * @param strs
     * @param len
     * @return
     */
    private boolean isCommonPrefix(String[] strs, int len){

        len ++;
        String str1 = strs[0].substring(0,len);
        for (int i = 1; i < strs.length; i++) {
            if (!strs[i].startsWith(str1)) {
                return false;
            }
        }
        return true;
    }

}
